import puppeteer from "puppeteer";

(async () => {
  // 禁止发出请求的资源类型(请不要将样式禁止，有些项目会因为禁止加载样式，导致js执行出错)
  const disabled_resource_type_arr = ["image", "font", "fetch", "media"];
  const browser = await puppeteer.launch({
    // headless: false,
    // devtools: true,
    args: [
      "--disable-gpu", // GPU硬件加速
      "--disable-dev-shm-usage", // 创建临时文件共享内存
      "--disable-setuid-sandbox", // uid沙盒
      "--disable-accelerated-2d-canvas", // canvas渲染
      "--no-first-run", // 没有设置首页。在启动的时候，就会打开一个空白页面。
      "--no-sandbox", // 沙盒模式
      "--no-zygote",
      "--single-process", // 单进程运行
      // "--user-data-dir=E:/test", // 使用缓存(能提交资源加载速度，但可能导致cookie也被保留,请酌情考虑是否需要启用)
    ],
  });
  const page = await browser.newPage();
  // 这里是将web控制台的信息打印到终端(可用于调试)
  // page.on("console", (msg) => console.log("PAGE LOG:", msg.text));
  // 启用拦截器，仅加载html和js即可
  await page.setRequestInterception(true);
  page.on("request", (interceptedRequest) => {
    // console.log(
    //   interceptedRequest.resourceType(),
    //   interceptedRequest.isInterceptResolutionHandled(),
    //   interceptedRequest.url()
    // );
    if (interceptedRequest.isInterceptResolutionHandled()) return;
    // 禁止所有：图片/css/字体/视频/音频的加载
    if (
      disabled_resource_type_arr.indexOf(interceptedRequest.resourceType()) >= 0
    )
      interceptedRequest.abort();
    else interceptedRequest.continue();
  });
  await page.goto("http://localhost:18081/home", {
    // 关于 waitUtil 官方说明: https://pptr.nodejs.cn/api/puppeteer.puppeteerlifecycleevent
    // 等到页内网络请求少于等于2个，且至少持续500ms时，则认为页面加载完毕
    waitUtil: "networkidle2",
  });
  // 生成网页截图,可用于判断拦截器是否生效效果
  await page.screenshot({ path: "screenshot-12138.png", fullPage: true });
  // 获取网页的完整html字符串
  const htmlContent = await page.content();
  // console.log(htmlContent);
  await browser.close();
})();
